package com.wlc.base.lambda;

import java.util.List;

/**
 * @author 王立朝 wanglichao@champion-credit.com
 * @description 方法的引用
 * @date 2021-07-14 07:57
 */
public class TestLambda2 {

    public void method01() {
        List<Hero> heroes = TestLambda.initData();
        System.out.println("引用静态方法：");
        // 引用静态方法
        filter(heroes, TestLambda2::heroTest);
        // 引用对象方法，需要有一个对象
        TestLambda2 testLambda2 = new TestLambda2();
        System.out.println("引用对象方法：");
        filter(heroes, testLambda2::heroTest2);
        // 引用容器中的方法
        // 1）使用lambda表达式
        System.out.println("使用lambda表达式筛选：");
        filter(heroes, (Hero hero) -> {
            return hero.getHp() > 100 && hero.getDamage() < 50;
        });
        // 2）简化lambda表达式
        System.out.println("简化lambda表达式筛选");
        filter(heroes, hero -> hero.getHp() > 100 && hero.getDamage() < 50);
        // 3）在lambda表达式中使用 容器中的方法
        System.out.println("在lambda表达式中使用容器的方法");
        filter(heroes, hero -> hero.match(hero));
        // 4）在lambda表达式中使用 容器中的方法，因为恰好 是一个方法，所以可以简写
        Hero hero = new Hero();
        // 引用对象方法
        System.out.println("引用对象方法");
        filter(heroes, hero::match);
        // 引用类方法
        System.out.println("引用类方法");
        filter(heroes, Hero::match2);
    }

    /**
     * 定义了一个非静态的方法
     *
     * @return
     */
    public boolean heroTest2(Hero hero) {
        return hero.getHp() > 100 && hero.getDamage() < 50;
    }

    /**
     * 定义了一个静态的方法
     *
     * @return
     */
    public static boolean heroTest(Hero hero) {
        return hero.getHp() > 100 && hero.getDamage() < 50;
    }

    public void filter(List<Hero> heroList, HeroChecker heroChecker) {
        for (Hero hero : heroList) {
            if (heroChecker.check(hero)) {
                System.out.println(hero);
            }
        }
    }

    public static void main(String[] args) {
        TestLambda2 testLambda2 = new TestLambda2();
        testLambda2.method01();
    }
}
